/**
 * 时间格式化
 * @param date 日期对象
 * @param format 格式字符串
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: Date, format: string): string => {
  const o = {
    'M+': date.getMonth() + 1, // 月份
    'D+': date.getDate(), // 日
    'H+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  };

  if (/(Y+)/.test(format)) {
    format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }

  for (const k in o) {
    if (new RegExp(`(${k})`).test(format)) {
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
      );
    }
  }

  return format;
};

/**
 * 通用日期时间格式化，支持各种类型的输入
 * @param date 日期对象、日期字符串或时间戳
 * @param format 格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串，无效日期返回空字符串
 */
export const formatDateTime = (
  date: Date | string | number | null | undefined,
  format = 'YYYY-MM-DD HH:mm:ss'
): string => {
  if (date === null || date === undefined || date === '') {
    return '';
  }

  let dateObj: Date;

  if (date instanceof Date) {
    dateObj = date;
  } else if (typeof date === 'string') {
    // 处理字符串日期，兼容各种格式
    if (date.indexOf('T') > -1 && date.indexOf('Z') > -1) {
      // ISO格式 "2023-01-01T12:00:00Z"
      dateObj = new Date(date);
    } else if (date.indexOf('/') > -1) {
      // 斜杠格式 "2023/01/01 12:00:00"
      dateObj = new Date(date.replace(/-/g, '/'));
    } else {
      // 其他格式
      dateObj = new Date(date);
    }
  } else if (typeof date === 'number') {
    // 时间戳
    dateObj = new Date(date);
  } else {
    return '';
  }

  // 检查日期是否有效
  if (isNaN(dateObj.getTime())) {
    return '';
  }

  return formatDate(dateObj, format);
};

/**
 * 格式化为本地日期时间格式
 * @param date 日期对象、日期字符串或时间戳
 * @param options 本地化选项
 * @returns 格式化后的本地日期时间字符串
 */
export const formatToLocaleDateTime = (
  date: Date | string | number | null | undefined,
  options: Intl.DateTimeFormatOptions = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false
  }
): string => {
  if (date === null || date === undefined || date === '') {
    return '';
  }

  let dateObj: Date;

  try {
    if (date instanceof Date) {
      dateObj = date;
    } else if (typeof date === 'string') {
      dateObj = new Date(date);
    } else if (typeof date === 'number') {
      dateObj = new Date(date);
    } else {
      return '';
    }

    // 检查日期是否有效
    if (isNaN(dateObj.getTime())) {
      return '';
    }

    return dateObj.toLocaleString('zh-CN', options).replace(/\//g, '-');
  } catch (e) {
    console.error('日期格式化错误:', e);
    return typeof date === 'string' ? date : '';
  }
};

/**
 * 数字格式化
 * @param num 数字
 * @param digits 小数位数
 * @returns 格式化后的数字字符串
 */
export const formatNumber = (num: number, digits = 0): string => {
  return num.toFixed(digits).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};

/**
 * 客户状态格式化
 * @param status 状态码
 * @returns 状态文本
 */
export const formatCustomerStatus = (status: number): string => {
  const statusMap: Record<number, string> = {
    1: '已录单',
    3: '待处理',
    4: '待面签',
    5: '已签约',
    6: '审核资料',
    7: '风控审批',
    8: '提级审批',
    9: '项目上报',
    10: '资方确认',
    11: '确认托管资料',
    12: '风控核实',
    13: '费用核实',
    14: '待放款',
    15: '放款待确认',
    16: '资料待入库',
    17: '待扣款',
    18: '待解押',
    19: '新行入押',
    20: '银行放款',
    21: '待还款',
    22: '还款待核实',
    23: '待完成',
    24: '已完成',
    25: '已取消'
  };

  return statusMap[status] || '未知状态';
};

/**
 * 客户类型格式化
 * @param type 客户类型
 * @returns 类型文本
 */
export const formatCustomerType = (type: number): string => {
  const typeMap: Record<number, string> = {
    1: '个人',
    2: '公司'
  };

  return typeMap[type] || '未知类型';
}; 